// 导入axios
import router from "@/router";
import store from "@/store";
import axios from "axios";
import { Message } from "element-ui";
import { getTimeStamp } from "@/utils/auth";
// 校验登录时间过期的方法
const tokenLongTime = 1000 * 60 * 60 * 2; // 2h
const checkTimeOut = () => {
  // (现在的时间 - 登录的时间) > token过期的时长  过期
  let loginTime = getTimeStamp();
  let nowTime = Date.now();
  return nowTime - loginTime > tokenLongTime;
};

// 创建axios实例
const service = axios.create({
  // baseURL: "/api", // 基准地址，这样是写死的，生产环境需要更换必须手动更换
  baseURL: process.env.VUE_APP_BASE_API,
});
// 请求拦截器 【携带token】
service.interceptors.request.use(
  async (config) => {
    // 如果登录了，携带上token
    const token = store.getters.token;
    if (token) {
      // 过期了吗
      if (checkTimeOut()) {
        Message.error("token过期，重新登录");
        await store.dispatch("user/quitAction");
        router.push("/login");
        return Promise.reject("token过期");
      }
      // 没过期就携带token
      config.headers["Authorization"] = "Bearer " + token;
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);
// 响应拦截器 【解构数据和错误的集中处理】
service.interceptors.response.use(
  (response) => {
    const { data, message, success, code } = response.data;
    if (success) {
      // 业务逻辑正确了
      return data;
    } else {
      Message.error(message);
      // 业务逻辑错误了
      return Promise.reject(message);
    }
  },
  async (error) => {
    // token过期被动处理： 根据复位前端返回的数据进行处理token过期
    // 请求错误了
    console.dir(error);
    if (
      error.response &&
      error.response.data &&
      error.response.data.code === 10002
    ) {
      Message.error("token过期，重新登录");
      await store.dispatch("user/quitAction");
      router.push("/login");
    }
    return Promise.reject(error);
  }
);
// 导出axios实例
export default service;
